package com.um.weixin.pay.service.impl;

import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest;
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReturnRequest;
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReturnV3Request;
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request;
import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingResult;
import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingReturnResult;
import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingReturnV3Result;
import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.um.weixin.pay.service.WxSharingService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 邓南辉
 * 日期 2023/5/11
 * 版权所有 广州优匠科技有限公司
 */
@Service
@Slf4j
public class WxSharingServiceImpl implements WxSharingService {

    @Autowired
    WxPayService wxService;

    /**
     * <pre>
     * 请求分账API
     *
     * 微信订单支付成功后，商户发起分账请求，将结算后的资金分到分账接收方
     * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_1.shtml
     * 接口链接: https://api.mch.weixin.qq.com/v3/profitsharing/orders
     *
     * 注意：
     * 对同一笔订单最多能发起20次分账请求，每次请求最多分给50个接收方
     * 此接口采用异步处理模式，即在接收到商户请求后，优先受理请求再异步处理，最终的分账结果可以通过查询分账接口获取
     * </pre>
     *
     * @param request {@link ProfitSharingRequest} 针对某一笔支付订单的分账方法
     * @return {@link ProfitSharingResult} 微信返回的分账结果
     * @throws WxPayException the wx pay exception
     * @see <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_1.shtml">微信文档</a>
     */
    @Override
    public ProfitSharingV3Result profitSharing(ProfitSharingV3Request request) throws WxPayException {
        ProfitSharingV3Result profitSharingResult = wxService.getProfitSharingService().profitSharingV3(request);

        return profitSharingResult;
    }

    /**
     * <pre>
     * 查询分账结果API（商户平台）
     *
     * 发起分账请求后，可调用此接口查询分账结果
     * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_2.shtml
     * 接口链接：https://api.mch.weixin.qq.com/v3/profitsharing/orders/{out_order_no}
     *
     * 注意：
     * • 发起解冻剩余资金请求后，可调用此接口查询解冻剩余资金的结果
     * </pre>
     *
     * @param outOrderNo    商户系统内部的分账单号，在商户系统内部唯一，同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@ 。
     * @param transactionId 微信支付订单号
     * @return {@link ProfitSharingResult} 微信返回的分账结果
     * @throws WxPayException the wx pay exception
     * @see <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_2.shtml">微信文档</a>
     */
    @Override
    public ProfitSharingV3Result getProfitSharingResult(String outOrderNo, String transactionId) throws WxPayException {
        ProfitSharingV3Result profitSharingV3Result = wxService.getProfitSharingService().profitSharingQueryV3(outOrderNo, transactionId);

        return profitSharingV3Result;
    }

    /**
     * <pre>
     * 请求分账回退API
     *
     * 如果订单已经分账，在退款时，可以先调此接口，将已分账的资金从分账接收方的账户回退给分账方，再发起退款
     * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_3.shtml
     * 接口链接: https://api.mch.weixin.qq.com/v3/profitsharing/return-orders
     *
     * 注意：
     * • 分账回退以原分账单为依据，支持多次回退，申请回退总金额不能超过原分账单分给该接收方的金额
     * • 此接口采用同步处理模式，即在接收到商户请求后，会实时返回处理结果
     * • 对同一笔分账单最多能发起20次分账回退请求
     * • 退款和分账回退没有耦合，分账回退可以先于退款请求，也可以后于退款请求
     * • 此功能需要接收方在商户平台-交易中心-分账-分账接收设置下，开启同意分账回退后，才能使用
     * </pre>
     *
     * @param request {@link ProfitSharingReturnRequest} 针对某一笔支付订单的分账方法
     * @return {@link ProfitSharingReturnResult} 微信返回的分账回退结果
     * @throws WxPayException the wx pay exception
     * @see <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_3.shtml">微信文档</a>
     */
    @Override
    public ProfitSharingReturnV3Result profitSharingReturn(ProfitSharingReturnV3Request request) throws WxPayException {
        ProfitSharingReturnV3Result profitSharingReturnResult = wxService.getProfitSharingService().profitSharingReturnV3(request);

        return profitSharingReturnResult;
    }

    /**
     * <pre>
     * 查询分账回退结果API（商户平台）
     *
     * 商户需要核实回退结果，可调用此接口查询回退结果
     * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_4.shtml
     * 接口链接：https://api.mch.weixin.qq.com/v3/profitsharing/return-orders/{out_return_no}
     *
     * 注意：
     * • 如果分账回退接口返回状态为处理中，可调用此接口查询回退结果
     * </pre>
     *
     * @param outOrderNo  原发起分账请求时使用的商户系统内部的分账单号
     * @param outReturnNo 调用回退接口提供的商户系统内部的回退单号
     * @return {@link ProfitSharingReturnResult} 微信返回的分账回退结果
     * @throws WxPayException the wx pay exception
     * @see <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_4.shtml">微信文档</a>
     */
    @Override
    public ProfitSharingReturnV3Result getProfitSharingReturnResult(String outOrderNo, String outReturnNo) throws WxPayException {
        ProfitSharingReturnV3Result profitSharingReturnResult = wxService.getProfitSharingService().profitSharingReturnQueryV3(outOrderNo, outReturnNo);

        return profitSharingReturnResult;
    }
}
